var Base = require('geoGameBase');
var Utils = require('geoUtils');
var Tween = require('geoTweenMoveTo');
var SceneLoader = require('geoSceneLoader');
var VisualCounter = require('geoVisualCounter');

var Game = cc.Class({
    extends: Base,

    properties: {

        title: {
            default: null,
            type: cc.Label,
        },

        scoreLabel:{
            default:null,
            type:cc.Label,
        },

        counter: {
            default: null,
            type: VisualCounter,
        },

        backPos: {
            default: null,
            type: cc.Node,
        },

        numWastes: {
            default: 5,
        },

        scorePerWaste:{
            default: 10,
        },

        wastesContainer: {
            default: null,
            type: cc.Node,
        },

        resultSceneLoader: {
            default: null,
            type: SceneLoader,
        },

        defaultDelay: {
            default: 6,
            tooltip: '初始垃圾间隔'
        },

        decTime: {
            default: 0.3,
            tooltip: '间隔减小系数'
        }

    },

    statics: {
        // DecTime:0,
        NumLevelsPassed: 0,
        LevelScore:0,
        TotalScore:0,
        IsReplay: false,
        WasteIndices:[],
        Results:[],
    },

    // LIFE-CYCLE CALLBACKS:

    // onLoad () {},

    start() {

        this.config();

        this.scheduleOnce(this.checkLevelComplete.bind(this), 2);
        // this.checkLevelComplete();
    },

    /**
     * 配置场景
     */
    config() {



        // 获取所有垃圾资源
        this._wastes = [];

        // 确定要使用的垃圾的索引
        if (Game.IsReplay == false)
            Game.WasteIndices = Utils.array.random([0,1,2,3,4,5], this.numWastes);

        // 获取垃圾
        Game.WasteIndices.forEach(i => {
            this._wastes.push(this.wastesContainer.children[i]);
        });




        // 垃圾间隔时间
        this._delay = this.defaultDelay - Game.NumLevelsPassed * this.decTime;

        // 绑定超时方法
        // this._timeUpFn = this.onTimeUp.bind(this);

        // 标识关卡数
        this.title.string = '第 ' + (Game.NumLevelsPassed + 1) + ' 关';

        // 初始化计数器
        this.counter.setCount(5);

        // 初始化分数
        Game.LevelScore = 0;
        this.scoreLabel.string = Game.LevelScore;


        // 配置结束，恢复重玩标志
        Game.IsReplay = false;

        // 清理结果
        Game.Results = [];
    },

    /**
     * 判断关卡是否结束
     */
    checkLevelComplete() {

        if (this.isLevelComplete() === true) {
            // this.endLevel();
            // 屏蔽用户操作
            this.maskInteraction(true);
            // 结束关卡，转场
            this.scheduleOnce(this.endLevel.bind(this), 2);
        } else {
            this.startRound();
        }

    },

    isLevelComplete() {
        return this._wastes.length == 0;
    },

    /**
     * 开局
     */
    startRound() {
        // 从垃圾列表抽出一个垃圾。
        this._currentWaste = Utils.array.random(this._wastes, 1, true)[0];
        var w = this._currentWaste;
        // 垃圾放到出现位置
        this.showItem(w);

        //
        this.setupTimer();

        // 设置计数减一
        this.counter.decCount();
    },

    /**
     * 拖放道具到非法区
     */
    dropInvalid(e, item, area) {
        this.itemBack(item, this.backPos);
    },

    /**
     * 拖放垃圾到合法区
     */
    dropValid(e, item, area) {

        var itemType = Utils.text.getQueryString(item.name, 'type');
        var areaType = Utils.text.getQueryString(area.name, 'type');

        if (itemType == areaType)
            this.doRight();
        else
            this.doWrong();


    },

    /**
     * 处理道具飞回
     */
    itemBack(item, backNode) {
        var t = item.getComponent(Tween);
        t.doTweenToNode(backNode, 0.3);
    },

    /**
     * 启动定时器
     */
    setupTimer() {
        // 取消之前的定时
        this.unschedule(this._timeUpFn);
        //
        this._timeUpFn = this.onTimeUp.bind(this);
        // 设置新定时
        this.scheduleOnce(this._timeUpFn, this._delay);
    },

    /**
     * 定时结束回调
     */
    onTimeUp() {
        this.doNone();
    },

    /**
     * 显示道具
     */
    showItem(item) {
        this.itemBack(item, this.backPos);
    },

    /**
     * 移除道具
     */
    removeItem(item) {

    },

    /**
     * 回答正确
     */
    doRight() {
        this.__recordResult('正确');

        cc.log('正确');
        // 加分
        Game.LevelScore += this.scorePerWaste;
        this.scoreLabel.string = Game.LevelScore;
        // 清除
        this.removeWaste();
    },

    /**
     * 回答错误
     */
    doWrong() {
        this.__recordResult('错误');
        
        cc.log('错误');
        // 清除
        this.removeWaste();
    },

    /**
     * 什么都没做
     */
    doNone() {
        this.__recordResult('超时');
        
        cc.log('超时');

        // 清除
        this.removeWaste();
    },

    __recordResult(result) {
        Game.Results.push(this._currentWaste.name + ' -> ' + result);
    },

    /**
     * 销毁当前垃圾
     */
    removeWaste() {
        if (this._currentWaste != null) {
            this._currentWaste.destroy();
        }
        this._currentWaste = null;
        //
        this.checkLevelComplete();
    },

    /**
     * 结束关卡
     */
    endLevel() {
        cc.log('关卡结束');

        // 递增关卡计数
        Game.NumLevelsPassed++;

        // 计算总分
        Game.TotalScore += Game.LevelScore;

        this.resultSceneLoader.tryLoadScene();
    },

    /**
     * 显示结果
     */
    showResult() {

    },

    /**
     * 暂停游戏逻辑
     */
    pauseLogic(){
        cc.director.pause();
    },

    /**
     * 恢复游戏逻辑
     */
    resumeLogic(){
        cc.director.resume();
    }

    // update (dt) {},
});
